const bcryptjs = require('bcryptjs')
const userModel = require('../db/users')
const respond = require('../utils/respond')
const jwt = require('jsonwebtoken')
const path = require('path')
module.exports = {
    // 注册
    register: (req, res) => {
        // 接收post数据
        let {username, password, email} = req.body
        // 所有数据都不能为空
        if(!username || !password || !email) {
            // 响应数据不能为空
            respond(res, 1, '数据不能为空')
            return // 阻止继续向下执行
        }
        // 到数据库中判读是否存在当前用户名
        // 到数据库中查询是否有条件为username的数据
        userModel.findOne({username}, (err, docs) => {
            // 判断是否有错误
            if(err) {
                respond(res, 2, '注册失败')
                return
            }
            // 判断是否查询到数据
            if(docs) {
                // 用户名被占用
                respond(res, 3, '用户名被占用')
                return
            }
            // 将数据添加到数据库
            userModel.insertMany([{username, password: bcryptjs.hashSync(password, 10), email}], (err, docs) => {
                if(err) {
                    respond(res, 2, '注册失败')
                    return
                }
                // 判断是否有插入的结果
                if(!docs.length) {
                    respond(res, 2, '注册失败')
                    return
                }
                respond(res, 0, '注册成功')
            })
        })
    },
    // 登录
    login: (req, res) => {
        // 接收post请求的数据
        let {username, password} = req.body
        // 验证数据
        if(!username || !password) {
            respond(res, 2, '数据不能为空')
            return
        }
        // 用username做条件查询数据中这个用户的数据
        userModel.findOne({username}, (err, docs) => {
            if(err) {
                respond(res, 2, '登录失败')
                return
            }
            // 是否查到数据
            if(!docs) {
                respond(res, 3, '账号或密码错误')
                return
            }
            // 查询到数据了 - 验证密码
            if(bcryptjs.compareSync(password, docs.password)) {
                // 令牌制造语法
                // jwt.sign(对象, 字符串)
                /*
                    令牌就类似于将一些简单的东西，通过特殊的算法进行排列组合，得出一个别人不容易看破的 - 加密
                */
                let token = jwt.sign({
                    username,
                    startTime: +new Date(),
                    expires: 7200*1000
                }, 'ASDFWETRRTYU$#^5kjfaklsdhfkjashf')
                respond(res, 0, '登录成功', {
                    // 颁发令牌 - jsonwebtoken - jwt
                    token: token,
                    //登录成功时再响应一个userid
                    userid:docs._id

                })
                return
            }
            respond(res, 3, '账号或密码错误')
        })
    },
    // 获取个人信息
    getUsers: (req, res) => {
        // 验证是否有令牌
        // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImN1aWh1YSIsInN0YXJ0VGltZSI6MTY2ODc1Njc3NDc2NywiZXhwaXJlcyI6NzIwMCwiaWF0IjoxNjY4NzU2Nzc0fQ.g1zT9peK0RsnxA03u-yrGidkWbrL125x48vGZeagKtI
        // console.log(req.headers)
        // if(!req.headers.authorization) {
        //     respond(res, 3, '缺少令牌！')
        //     return
        // }
        // 验证令牌是否正确 - 解不开会报错
        // let tokenData = jwt.verify(req.headers.authorization, 'ASDFWETRRTYU$#^5kjfaklsdhfkjashf');
        // console.log(tokenData);

        // try{测试要执行的代码}catch(err){测试的代码报错了，不会自动报错，在这里可以捕获到错误，决定是否报错或执行其他代码}
        // let tokenData
        // try{
        //     tokenData = jwt.verify(req.headers.authorization, 'ASDFWETRRTYU$#^5kjfaklsdhfkjashf');
        //     // console.log(tokenData);
        // } catch(err) {
        //     // 手动记录一下这个错误
        //     writeErrLog(err)
        //     respond(res, 4, '令牌是错误的')
        //     return
        // }

        // 令牌是否有效
        // console.log(tokenData);
        // {
        //     username: 'cuihua',
        //     startTime: 1668756774767,
        //     expires: 7200,
        //     iat: 1668756774
        // }
        // if(tokenData.startTime + tokenData.expires < +new Date()) {
        //     respond(res, 5, '令牌过期了')
        //     return
        // }
        

        // 获取前端传递的_id
        // 获取get请求数据：
        /*
            路径?键=值  ==>  req.query
            路径/值     ==>  req.params
        */
        let {_id} = req.params
        // 对数据简单验证
        if(!_id) {
            respond(res, 2, '缺失用户id参数')
            return
        }
        // 根据_id到数据库中查询这个用户的所有信息
        userModel.findOne({_id}, {__v: 0, password: 0}, (err, docs) => {
            if(err) {
                respond(res, 2, '用户信息获取失败')
                return
            }
            // 判断是否有数据
            if(!docs) {
                respond(res, 2, '用户信息获取失败')
                return
            }
            // 验证是否是获取自己的信息
            if(req.tokenData.username != docs.username) {
                respond(res, 6, '不能获取别人的信息')
                return
            }
            docs.avatar='http://localhost:3000/'+docs.avatar
            // 给前端响应用户信息数据
            respond(res, 0, '用户信息获取成功', docs)
        })
    },
    // 修改用户信息
    editUser: async (req, res) => {
        // 获取token
        // 验证令牌
        //从地址栏获取id
        let {_id}=req.params
        // console.log(_id)
        console.log(req.body)
        let{username,email}=req.body
        console.log(req.file)
        //文件路径
        let filePath='uploads/'+req.file.filename
        let docs=await userModel.updateOne({_id},{
            username,
            email,
            avatar:filePath
        })
        respond(res,0,'修改成功')
    }
}